<!DOCTYPE html>
<html lang="zh-Hans">
<head>

    <!--[if lt IE 9]>
        <style>body {display: none; background: none !important} </style>
        <meta http-equiv="Refresh" Content="0; url=//outdatedbrowser.com/" />
    <![endif]-->

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="format-detection" content="telephone=no" />
<meta name="author" content="FreeShow" />



<meta property="og:type" content="article">
<meta property="og:title" content="Java之I/O以及其它主题">
<meta property="og:url" content="https://freeshow.github.io/Programming/Java/Java之I-O以及其它主题/index.html">
<meta property="og:site_name" content="FreeShow">
<meta property="og:updated_time" content="2017-03-28T08:06:48.311Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Java之I/O以及其它主题">

<link rel="apple-touch-icon" href= "/apple-touch-icon.png">


    <link rel="alternate" href="/atom.xml" title="FreeShow" type="application/atom+xml">



    <link rel="shortcut icon" href="/favicon.ico">



    <link href="//cdn.bootcss.com/animate.css/3.5.1/animate.min.css" rel="stylesheet">



    <link href="//cdn.bootcss.com/fancybox/2.1.5/jquery.fancybox.min.css" rel="stylesheet">



    <script src="//cdn.bootcss.com/pace/1.0.2/pace.min.js"></script>
    <link href="//cdn.bootcss.com/pace/1.0.2/themes/blue/pace-theme-minimal.css" rel="stylesheet">


<link rel="stylesheet" href="/css/style.css">



<link href="//cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">


<title>Java之I/O以及其它主题 | FreeShow</title>

<script src="//cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
<script src="//cdn.bootcss.com/clipboard.js/1.5.10/clipboard.min.js"></script>

<script>
    var yiliaConfig = {
        fancybox: true,
        animate: true,
        isHome: false,
        isPost: true,
        isArchive: false,
        isTag: false,
        isCategory: false,
        fancybox_js: "//cdn.bootcss.com/fancybox/2.1.5/jquery.fancybox.min.js",
        scrollreveal: "//cdn.bootcss.com/scrollReveal.js/3.1.4/scrollreveal.min.js",
        search: true
    }
</script>


    <script>
        yiliaConfig.jquery_ui = [true, "//cdn.bootcss.com/jqueryui/1.10.4/jquery-ui.min.js", "//cdn.bootcss.com/jqueryui/1.10.4/css/jquery-ui.min.css"];
    </script>



    <script> yiliaConfig.rootUrl = "\/";</script>






</head>
<body>
  <div id="container">
    <div class="left-col">
    <div class="overlay"></div>
<div class="intrude-less">
    <header id="header" class="inner">
        <a href="/" class="profilepic">
            <img src="/img/avatar.png" class="animated zoomIn">
        </a>
        <hgroup>
          <h1 class="header-author"><a href="/">FreeShow</a></h1>
        </hgroup>

        
        <p class="header-subtitle">在追求艺术的道路上狂奔</p>
        

        
            <form id="search-form">
            <input type="text" id="local-search-input" name="q" placeholder="search..." class="search form-control" autocomplete="off" autocorrect="off" searchonload="false" />
            <i class="fa fa-times" onclick="resetSearch()"></i>
            </form>
            <div id="local-search-result"></div>
            <p class='no-result'>No results found <i class='fa fa-spinner fa-pulse'></i></p>
        


        
            <div id="switch-btn" class="switch-btn">
                <div class="icon">
                    <div class="icon-ctn">
                        <div class="icon-wrap icon-house" data-idx="0">
                            <div class="birdhouse"></div>
                            <div class="birdhouse_holes"></div>
                        </div>
                        <div class="icon-wrap icon-ribbon hide" data-idx="1">
                            <div class="ribbon"></div>
                        </div>
                        
                        <div class="icon-wrap icon-link hide" data-idx="2">
                            <div class="loopback_l"></div>
                            <div class="loopback_r"></div>
                        </div>
                        
                        
                        <div class="icon-wrap icon-me hide" data-idx="3">
                            <div class="user"></div>
                            <div class="shoulder"></div>
                        </div>
                        
                    </div>
                    
                </div>
                <div class="tips-box hide">
                    <div class="tips-arrow"></div>
                    <ul class="tips-inner">
                        <li>菜单</li>
                        <li>标签</li>
                        
                        <li>友情链接</li>
                        
                        
                        <li>关于我</li>
                        
                    </ul>
                </div>
            </div>
        

        <div id="switch-area" class="switch-area">
            <div class="switch-wrap">
                <section class="switch-part switch-part1">
                    <nav class="header-menu">
                        <ul>
                        
                            <li><a href="/">主页</a></li>
                        
                            <li><a href="/archives/">所有文章</a></li>
                        
                            <li><a href="/tags/">标签云</a></li>
                        
                            <li><a href="/about/">关于我</a></li>
                        
                        </ul>
                    </nav>
                    <nav class="header-nav">
                        <ul class="social">
                            
                                <a class="fa Email" href="mailto:877646746@qq.com" title="Email"></a>
                            
                                <a class="fa GitHub" href="http://github.com/freeshow" title="GitHub"></a>
                            
                                <a class="fa 新浪微博" href="http://weibo.com/freeshowself" title="新浪微博"></a>
                            
                                <a class="fa CSDN" href="http://blog.csdn.net/u011026329" title="CSDN"></a>
                            
                        </ul>
                    </nav>
                </section>
                
                
                <section class="switch-part switch-part2">
                    <div class="widget tagcloud" id="js-tagcloud">
                        <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/Android/">Android</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/C/">C</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Crawler/">Crawler</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Hadoop/">Hadoop</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Hexo/">Hexo</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Java/">Java</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Linux/">Linux</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Python/">Python</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/SIP/">SIP</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Scala/">Scala</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Shell/">Shell</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Spark/">Spark</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Tools/">Tools</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/WebRTC/">WebRTC</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/XMPP/">XMPP</a></li></ul>
                    </div>
                </section>
                
                
                
                <section class="switch-part switch-part3">
                    <div id="js-friends">
                    
                      <a class="main-nav-link switch-friends-link" href="https://hexo.io">Hexo</a>
                    
                      <a class="main-nav-link switch-friends-link" href="https://github.com/freeshow">GitHub</a>
                    
                      <a class="main-nav-link switch-friends-link" href="http://freeshow.github.io/">FreeShow</a>
                    
                    </div>
                </section>
                

                
                
                <section class="switch-part switch-part4">
                
                    <div id="js-aboutme">我是一个喜欢无拘无束、追求自由、热爱分享的小小小码农！</div>
                </section>
                
            </div>
        </div>
    </header>                
</div>
    </div>
    <div class="mid-col">
      <nav id="mobile-nav">
      <div class="overlay">
          <div class="slider-trigger"></div>
          <h1 class="header-author js-mobile-header hide"><a href="/" title="回到主页">FreeShow</a></h1>
      </div>
    <div class="intrude-less">
        <header id="header" class="inner">
            <a href="/" class="profilepic">
                <img src="/img/avatar.png" class="animated zoomIn">
            </a>
            <hgroup>
              <h1 class="header-author"><a href="/" title="回到主页">FreeShow</a></h1>
            </hgroup>
            
            <p class="header-subtitle">在追求艺术的道路上狂奔</p>
            
            <nav class="header-menu">
                <ul>
                
                    <li><a href="/">主页</a></li>
                
                    <li><a href="/archives/">所有文章</a></li>
                
                    <li><a href="/tags/">标签云</a></li>
                
                    <li><a href="/about/">关于我</a></li>
                
                <div class="clearfix"></div>
                </ul>
            </nav>
            <nav class="header-nav">
                        <ul class="social">
                            
                                <a class="fa Email" target="_blank" href="mailto:877646746@qq.com" title="Email"></a>
                            
                                <a class="fa GitHub" target="_blank" href="http://github.com/freeshow" title="GitHub"></a>
                            
                                <a class="fa 新浪微博" target="_blank" href="http://weibo.com/freeshowself" title="新浪微博"></a>
                            
                                <a class="fa CSDN" target="_blank" href="http://blog.csdn.net/u011026329" title="CSDN"></a>
                            
                        </ul>
            </nav>
        </header>                
    </div>
    <link class="menu-list" tags="标签" friends="友情链接" about="关于我"/>
</nav>
      <div class="body-wrap"><article id="post-Programming/Java/Java之I-O以及其它主题" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/Programming/Java/Java之I-O以及其它主题/" class="article-date">
      <time datetime="2016-07-23T15:07:45.000Z" itemprop="datePublished">2016-07-23</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      Java之I/O以及其它主题
    </h1>
  

      </header>
      
      <div class="article-info article-info-post">
        
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/编程语言/">编程语言</a>
    </div>


        
    <div class="article-tag tagcloud">
        <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Java/">Java</a></li></ul>
    </div>

        <div class="clearfix"></div>
      </div>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <p><excerpt in="" index="" |="" 首页摘要=""><br><a id="more"></a></excerpt></p>
<the rest="" of="" contents="" |="" 余下全文="">

<p><strong>13.1 I/O的基础知识</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">在前面的实例程序中没有大量使用I/O。实际上，除了print()和println()方法之外，基本上没有使用其他的I/O方法。原因很简单：大多数实际的Java应用程序不是基与文本的控制台程序。相反，要么是面向图形的程序——这类程序依赖于Java的GUI框架(如Swing、AWT或JavaFX)来进行用户交互，要么是Web应用程序。尽管作为教学演示，基于文本的控制台程序是很优秀的，但是对于使用Java编写实际的程序，它们并不重要。此外，Java对控制台I/O的支持也是有限的，即使是简单的示例程序，使用它们也有些蹩脚。基于文本的控制台I/O对于实际的Java编程确实用处不大。</div></pre></td></tr></table></figure></p>
<p><strong>13.1.1 流</strong></p>
<pre><code>Java程序通过流执行I/O。流是一种抽象，要么产生信息，要么使用信息。流通过Java的I/O系统链接到物理设备。所有流的行为方式都是相同的，尽管与它们链接的物理设备是不同的。因此，可以为任意类型的设备应用相同的I/O类和方法。这意味着可以将许多不同类型的输入————磁盘文件、键盘或网络socket，抽象为输入流。与之对应，输出流可以引用控制台、磁盘文件或网络连接。流是输入/输出的一种清晰的方式，例如，代码中的所有部分都不需要理解键盘和网络之间的区别。流是Java在有java.io包定义的类层次中实现的。

注意：除了在java.io包中定义的基于流的I/O外，Java还提供了基于缓冲和基于通道的I/O,它们是在java.nio及其子包中定义的。
</code></pre><p><strong>13.1.2 字节流和字符流</strong></p>
<pre><code>Java定义了两种类型的流：字节流和字符流。
字节流为处理字节的输入和输出提供了方法。例如，当读取和写入二进制数据时，使用的就是字节流。
字符流为处理字符的输入和输出提供了方便的方法。它们使用Unicode编码，所以可以被国际化。此外，在某些情况下，字符流比字节流高效。

另外一点：在最底层，所有I/O仍然是面向字节的。基于字符的流只是为了处理字符提供了一种方便和高效的方法。

1.字节流

字节流是通过两个类层次定义的。在顶级是两个抽象类：InputStream和OutputStream。每个抽象类都有几个处理各种不同设备的具体子类，例如磁盘文件、网络连接甚至磁盘缓冲区。

抽象类InputStream和OutputStream定义了一些其他流类实现的一些关键方法。其中最重要的两个方法是read()和write(),这两个方法分别分别读取和写入字节数据。每个方法都有抽象形式，派生的流类必须重写这两个方法。

2.字符流类

字符流是通过两个类层次定义的。在顶层是两个抽象类：Reader和Writer。这两个抽象类处理Unicode字符流。
</code></pre><p><strong>13.1.3 预定义流</strong></p>
<pre><code>所有Java程序都自动导入java.lang包。这个包定义了System类，该类封装了运行时环境的某些方法。System还包含了3个预定义的流变量：in、out以及err.这些变量在System类中被声明为public、static以及final。这意味着程序中其他任何部分都可以使用它们，而不需要引用特定的System对象。

System.out引用标准的输出流，默认情况下是控制台。System.in引用标准的输入流，默认情况下是键盘。System.err引用标准的错误流，默认情况下也是控制台。但是，这些流可以被重定向到任何兼容的I/O设备。

System.in是InputStream类型的对象；System.out和System.err是PrintStream类型的对象。这些都是字节流，尽管他们通常用于从控制台读取字符以及向控制台写入字符。可以看出，如果愿意的话，可以在基于字符的流中封装这些流。
</code></pre><p><strong>13.2 读取控制台输入</strong></p>
<pre><code>在Java1.0中，执行控制台输入的唯一方法是使用字节流。现在仍然可以使用字节流读取控制台输入。但是，对于商业应用程序，读取控制台输入最好方法是使用面向字符的流。使用面向字符的流可以使程序更容易国际化和维护。

在Java中，控制台输入是通过从System.in读取完成的。为了获得与控制台关联的基于字符的流，可以在BufferedReader对象中封装System.in。BufferedReader支持缓冲的输入流。通常使用的构造函数如下：

BufferedReader(Reader inputReader)

其中inputReader是与即将创建的BufferedReader实例链接的字符流。而System.in是字节流，故需要先将字节流转换为字符流。Reader是抽象类，InputStreamReader是它的一个具体子类，该类将字节转换为字符。为了获得与System.in链接的InputStreamReader对象，使用下面的构造函数：

InputStreamReader(InputStream inputStream)

因为System.in引用InputStream类型的对象，所以可以用作inputStream参数。将这些内容结合起来，下面的代码创建了一个与键盘链接的BufferReader对象：

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

执行这条语句之后，br就通过System.in与控制台链接的基于字符的流。
</code></pre><p><strong>13.2.1 读取字符</strong></p>
<pre><code>int read()throws IOException

每次调用read()方法都会从输入流读取一个字符，并将之作为整形值返回。如果达到流的末尾，就返回-1；

例如：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">import java.io.*;</div><div class="line">	</div><div class="line">class BRRead</div><div class="line">&#123;</div><div class="line">	public static void main(String[] args) throws IOException</div><div class="line">	&#123;</div><div class="line">		char c;</div><div class="line">		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));</div><div class="line">			System.out.println(&quot;Enter characters, &apos;q&apos; to quit.&quot;);</div><div class="line">			</div><div class="line">		do</div><div class="line">		&#123;</div><div class="line">			c = (char)br.read();</div><div class="line">			System.out.println(c);</div><div class="line">		&#125;while(c != &apos;q&apos;);</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>下面是一次示例运行：
Enter characters, &apos;q&apos; to quit.
123abcq
1
2
3 
a 
b 
c 
q 

System.in是按行缓冲的。这意味着在按下Enter之前，实际上没有输入被传递到程序。
</code></pre><p><strong>13.2.2 读取字符</strong></p>
<pre><code>从键盘中读取字符串可以使用BufferReader类的readLine()方法，该方法的一般形式如下所示;

String readLine() throws IOException

可以看出该方法返回一个String字符串。

例如：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">import java.io;</div><div class="line">	</div><div class="line">class BRReadLines</div><div class="line">&#123;</div><div class="line">	public static void main(String[] args) throws IOException</div><div class="line">	&#123;</div><div class="line">		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));</div><div class="line">			</div><div class="line">		String str;</div><div class="line">		System.out.println(&quot;Enter lines of text.&quot;);</div><div class="line">		System.out.println(&quot;Enter &apos;stop&apos; to quit.&quot;);</div><div class="line">			</div><div class="line">		do</div><div class="line">		&#123;</div><div class="line">			str = br.readLine();</div><div class="line">			System.out.println(str);</div><div class="line">		&#125;while(! str.equals(&quot;stop&quot;));</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p><strong>13.3 向控制台写输出</strong></p>
<pre><code>在前面提到过，使用print()和println()是向控制台写输出的最容易的方式。这个方法是有PrintStream类(也就是System.out引用的对象的类型)定义的。System.out
</code></pre><p>尽管是字节流，但是对于简单的程序仍然何以使用。</p>
<pre><code>因为PrintStream是派生自OutputStream的输出流，所以还实现了低级的write()方法。因此，可以使用write()向控制台输出。

void write(int byteval);

例如：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">class WriteDemo</div><div class="line">&#123;</div><div class="line">	public static void main(String[] args)</div><div class="line">	&#123;</div><div class="line">		int b;</div><div class="line">		b = &apos;A&apos;;</div><div class="line">		System.out.write(b);</div><div class="line">		System.out.write(&apos;\n&apos;);</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>通常不会使用write()执行控制台输出(尽管在某些情况下这么做是有用的)，因为print()和println()确实更容易使用。
</code></pre><p><strong>13.4 PrintWriter类</strong></p>
<pre><code>尽管使用System.out向控制台输出可以接受，但是最好将其用于调试或者用于实例程序。对于实际的程序，使用Java向控制台输出的推荐方法是通过PrintWriter流。
</code></pre><p>PrintWriter是基于字符的流，为控制台输出使用基于字符的流，可以使程序国际化更容易。</p>
<pre><code>PrintWriter类定义了几个构造函数，在此使用的构造函数如下所示：

Printwrite(OutputStream outputStream,boolean flushingOn)

其中，flushingOn控制Java是否在每次调用println()方法时刷新输出流。如果flushingOn为true,就自动刷新；如果为false，那么不会自动刷新;

PrintWriter类支持print()和println()方法，因此，可以使用与System.out相同的方式使用它们。如果参数不是简单类型，PrintWriter的方法会调用对象的toString()方法，然后输出。例如，下面这行代码是创建一个连接到控制台输出的PrintWriter；

PrintWriter pw = new PrintWriter(System.out,true);

例如：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">import.java.io.*;</div><div class="line">	</div><div class="line">class PrintWriterDemo</div><div class="line">&#123;</div><div class="line">	public static void main(String[] args)</div><div class="line">	&#123;</div><div class="line">		PrintWriter pw = new PrintWriter(System.out,true);</div><div class="line">			</div><div class="line">		pw.println(&quot;This is a string&quot;);</div><div class="line">		int i = -7;</div><div class="line">		pw.println(i);</div><div class="line">			</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>输出如下：
This is a string 
-7
</code></pre><p><strong>13.5 读/写文件</strong></p>
<pre><code>对于读/写文件，两个最常用的流类是FileInputStreamReader和FileOutputStream，这两个创建与文件链接的字节流。为了打开文件，只需要简单的这些类中某个类的对象，指定文件名作为构造函数的参数即可。尽管两个类也支持其他构造函数，但在此将使用一下方式：

FileInputStream(String fileName) throws FileNotFoundException
FileOutputStream(String fileName) throws FileNotFoundException

其中，fileName指定希望打开的文件名。当创建输入流时，如果文件不存在，就会抛出FileNotFoundException异常。对于输出流，如果不能打开文件或不能创建文件，也会抛出FileNotFoundException异常。FileNotFoundException是IOException的子类。当打开输出文件时，先前存在的同名文件将被销毁。

文件使用完成之后必须关闭文件。关闭文件是通过close()方法完成的，FileInputStream和FileOutputStream都实现了该方法。该方法的声明如下：

void close() throws IOException

关闭文件会释放为文件分配的系统资源，从而允许其他文件使用这些资源。关闭文件失败会导致&quot;内层泄露&quot;，因为未使用的资源没有被释放。

注意：从JDK 7开始，close()方法是由java.lang包中的AutoCloseable接口指定的。java.io包中的Closeable接口继承了AutoCloseable接口，所有流类都实现了这两个接口，包括FileInputStream和FileOutputStream。

可以使用两种方式关闭文件：
第一种是传统方法，当在不需要文件时显示调用close()方法。这是JDK 7之前所有Java版本使用的方式，所以在所有遗留代码中可以看到这种方式。
第二种是使用带资源的try语句，这种try语句是由JDK 7新增的，当不在需要文件时自动关闭文件。在这种方式写没有显示调用close()方法。因为JDK 7以后close()函数由AutoCloseable接口指定。故可以隐身自动关闭文件。

下面先介绍关闭文件的传统方式，后面介绍带资源的try语句。

为了读取文件，可以使用在FileInputStreamReader中定义的read()版本。

int read() throws IOException

每次调用read()方法时，都会从文件读取一个字节，并作为整型值返回。当到达文件末尾时，read()方法返回-1.

下面的程序使用read()方法读取和显示文件的内容，该文件包含ASCII文本。文件名是作为命令行参数指定的。
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div></pre></td><td class="code"><pre><div class="line">import java.io.*;</div><div class="line"></div><div class="line">class ShowFile</div><div class="line">&#123;</div><div class="line">	public static void main(String[] args)</div><div class="line">	&#123;</div><div class="line">		int i;</div><div class="line">		FileInputStream fin;</div><div class="line">		</div><div class="line">		if(args.length != 1)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;Usage: ShowFile fileName&quot;);</div><div class="line">			return;</div><div class="line">		&#125;</div><div class="line">		</div><div class="line">		//打开文件</div><div class="line">		try</div><div class="line">		&#123;</div><div class="line">			fin = new FileInputStream(args[0]);</div><div class="line">		&#125;</div><div class="line">		catch(FileNotFoundException e)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;Cannot Open File.&quot;);</div><div class="line">			return;</div><div class="line">		&#125;</div><div class="line">		</div><div class="line">		//访问文件</div><div class="line">		try</div><div class="line">		&#123;</div><div class="line">			do</div><div class="line">			&#123;</div><div class="line">				i = fin.read();</div><div class="line">				if(i != -1) System.out.print((char)i);</div><div class="line">			&#125;while(i != -1);</div><div class="line">		&#125;</div><div class="line">		catch(IOException e)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;Error reading file.&quot;);</div><div class="line">		&#125;</div><div class="line">		</div><div class="line">		//关闭文件 </div><div class="line">		try</div><div class="line">		&#123;</div><div class="line">			fin.close();</div><div class="line">		&#125;</div><div class="line">		catch(IOException e)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;Error Closing File.&quot;);</div><div class="line">		&#125;</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>尽管前面的例子中在读取文件后关闭了文件流，但是另个种处理方式通常很有用，就是在finally代码块中调用close()方法。在这种方式下，访问文件的所有方法都被包含在try代码块中，并使用finally代码块关闭文件。对于这种方式，不管try代码块是如何终止的，文件都会被关闭。例如：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div></pre></td><td class="code"><pre><div class="line">try</div><div class="line">&#123;</div><div class="line">	do</div><div class="line">	&#123;</div><div class="line">		i = fin.read();</div><div class="line">		if(i != -1) System.out.print(i);</div><div class="line">	&#125;while(i != -1);</div><div class="line">&#125;</div><div class="line">catch(IOException e)</div><div class="line">&#123;</div><div class="line">	System.out.println(&quot;Error Reading File.&quot;);</div><div class="line">&#125;</div><div class="line">finally</div><div class="line">&#123;</div><div class="line">	try</div><div class="line">	&#123;</div><div class="line">		fin.close();</div><div class="line">	&#125;</div><div class="line">	catch(IOException e)</div><div class="line">	&#123;</div><div class="line">		System.out.println(&quot;Error Closing File.&quot;);</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>尽管这么做对于这个例子没有什么问题，但一般来说，这种方式的一个优点是：即使访问文件的代码因为与I/O无关的异常而终止，finally代码块也仍然会关闭文件。

有时在单个try代码块中(而不是独立的两个代码块)中封装打开文件和访问文件的代码，然后使用finally代码块关闭文件更容易一些。例如：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div></pre></td><td class="code"><pre><div class="line">import java.io.*;</div><div class="line"></div><div class="line">class ShowFile</div><div class="line">&#123;</div><div class="line">	public static void main(String[] args)</div><div class="line">	&#123;</div><div class="line">		int i;</div><div class="line">		FileInputStream fin = null;</div><div class="line">		</div><div class="line">		if(args.length != 1)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;Usage: ShowFile fileName&quot;);</div><div class="line">			return;</div><div class="line">		&#125;</div><div class="line">		</div><div class="line">		try</div><div class="line">		&#123;</div><div class="line">			fin = new FileInputStream(args[0]);</div><div class="line">			</div><div class="line">			do</div><div class="line">			&#123;</div><div class="line">				i = fin.read();</div><div class="line">				if(i != -1) System.out.println((char) i);</div><div class="line">			&#125;while(i != -1);</div><div class="line">		&#125;</div><div class="line">		catch(FileNotFoundException e)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;File Not Found.&quot;);</div><div class="line">		&#125;</div><div class="line">		catch(IOException e)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;An I/O Error Occurred&quot;);</div><div class="line">		&#125;</div><div class="line">		finally</div><div class="line">		&#123;</div><div class="line">			try</div><div class="line">			&#123;</div><div class="line">				if(fin != null) fin.close();</div><div class="line">			&#125;</div><div class="line">			catch(IOException e)</div><div class="line">			&#123;</div><div class="line">				System.out.println(&quot;Error Closing File&quot;);</div><div class="line">			&#125;</div><div class="line">		&#125;</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>对于前面的例子，还可以更紧凑的使用try/catch语句。因为FileNotFoundException是IOException的子类，所以这种异常不需要单独捕获。例如，下面的语句进行了重新编写以消除捕获FileNotFoundException异常，在这种情况下，会显示错误的标准异常消息。
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line">try</div><div class="line">&#123;</div><div class="line">	fin = new FileInputStream(args[0]);</div><div class="line">	</div><div class="line">	do</div><div class="line">	&#123;</div><div class="line">		i = fin.read();</div><div class="line">		if(i != -1) System.out.println((char) i);</div><div class="line">	&#125;while(i != -1);</div><div class="line">&#125;</div><div class="line">catch(IOException e)</div><div class="line">&#123;</div><div class="line">	System.out.println(&quot;I/O Error: &quot;+e);</div><div class="line">&#125;</div><div class="line">finally</div><div class="line">&#123;</div><div class="line">	try</div><div class="line">	&#123;</div><div class="line">		if(fin != null) fin.close();</div><div class="line">	&#125;</div><div class="line">	catch(IOException e)</div><div class="line">	&#123;</div><div class="line">		System.out.println(&quot;Error Closing File&quot;);</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>为了向文件中写入内容，可以使用FileOutputStream定义的write()方法，该方法最简单的形式如下：

void write(int byteval) throws IOException

例如，使用write()方法复制文件：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div></pre></td><td class="code"><pre><div class="line">import java.io.*;</div><div class="line"></div><div class="line">class CopyFile</div><div class="line">&#123;</div><div class="line">	public static void main(String[] args)</div><div class="line">	&#123;</div><div class="line">		int i;</div><div class="line">		FileInputStream fin;</div><div class="line">		FileOutputStream fout;</div><div class="line">		</div><div class="line">		if(args.length != 2)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;Usage: CopyFile from to&quot;);</div><div class="line">			return;</div><div class="line">		&#125;</div><div class="line">		</div><div class="line">		try</div><div class="line">		&#123;</div><div class="line">			fin = new FileInputStream(args[0]);</div><div class="line">			fout = new FileOutputStream(args[1]);</div><div class="line">			</div><div class="line">			do</div><div class="line">			&#123;</div><div class="line">				i = fin.read();</div><div class="line">				if(i != -1) fout.write(i);</div><div class="line">			&#125;</div><div class="line">		&#125;</div><div class="line">		catch(IOException e)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;I/O Error: &quot;+e);</div><div class="line">		&#125;</div><div class="line">		finally</div><div class="line">		&#123;</div><div class="line">			try</div><div class="line">			&#123;</div><div class="line">				if(fin != null) fin.close();</div><div class="line">			&#125;</div><div class="line">			catch(IOException e2)</div><div class="line">			&#123;</div><div class="line">				System.out.println(&quot;Error Closing Input File&quot;);</div><div class="line">			&#125;</div><div class="line">			</div><div class="line">			try</div><div class="line">			&#123;</div><div class="line">				if(fout != null) fout.close();</div><div class="line">			&#125;</div><div class="line">			catch(IOException e2)</div><div class="line">			&#123;</div><div class="line">				System.out.println(&quot;Error Closing Output File&quot;);</div><div class="line">			&#125;</div><div class="line">		&#125;</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p><strong>13.6 自动关闭文件</strong></p>
<pre><code>在前面，一旦不在需要文件，示例程序就显示调用close()方法以关闭文件。这是JDK 7以前的Java版本使用的关闭文件方式。JDK 7之后增加了一个新特性，该特性提供了另外一种资源管理(例如文件流)的方式，这种方式能自动关闭文件。这个特性有时被称为自动资源管理，该特性以try语句的扩展板为基础。自动资源管理的主要优点是：当不在需要文件(或其他资源)时，可以防止无意中释放它们。

自动资源管理基于try语句的扩展形式，它的一般形式如下所示：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">try(resource-specification)</div><div class="line">&#123;</div><div class="line">	//use the resource</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>其中，resource-specification是用来声明和初始化资源(例如文件流)的语句。该语句包含一个变量声明，在该变量声明中使用将被管理的对象引用初始化变量。当try语句块结束时，自动释放资源。
当然，这种形式的try语句也可以包含catch和finally子句。新形式的try语句被称为带资源的try语句。

对于那些实现了AutoCloseable接口的资源，才能使用带资源的try语句。AutoCloseable接口由java.lang包定义，该接口定义了close()方法。java.io包中的Closable接口继承自AutoCloseable接口。所有流类都实现了这两个接口。因此，当使用流时————包括文件流，可以使用带资源的try语句。

下面是ShoeFile程序的改写版，该版本使用自动文件关闭功能：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div></pre></td><td class="code"><pre><div class="line">import java.io.*;</div><div class="line"></div><div class="line">class ShowFile</div><div class="line">&#123;</div><div class="line">	public static void main(String[] args)</div><div class="line">	&#123;</div><div class="line">		int i;</div><div class="line">		</div><div class="line">		if(args.length != 1)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;Usage: ShowFile fileName&quot;);</div><div class="line">			return;</div><div class="line">		&#125;</div><div class="line">		</div><div class="line">		try(FileInputStream fin = new FileInputStream(args[0]))</div><div class="line">		&#123;</div><div class="line">			do</div><div class="line">			&#123;</div><div class="line">				i = fin.read();</div><div class="line">				if(i != -1) System.out.println((char) i);</div><div class="line">			&#125;while(i != -1);</div><div class="line">		&#125;</div><div class="line">		catch(FileNotFoundException e)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;File Not Found.&quot;);</div><div class="line">		&#125;</div><div class="line">		catch(IOException e)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;An I/O Error Occurred&quot;);</div><div class="line">		&#125;</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>在这个程序中，请特别注意在try语句中打开文件的方式：

try(FileInputStream fin = new FileInputStream(args[0])){}

注意try语句的资源约定部分声明了一个FileImputStream类型的变量fin,然后将由FileInputStream类构造函数打开的文件的引用赋值给该变量。因此，该程序的这个版本中，变量fin局限于try代码块，当进入try代码块时创建。当离开代码块时，会隐式的调用close()方法以关闭与fin关联的流。不需要显示的调用close()方法，这意味着不可能忘记关闭文件。这是使用带资源的try语句的关键好处。

try语句中声明的资源被隐式声明为final，理解这一点很重要。这意味着在创建资源变量后，不能将其他资源赋值给该变量。此外，资源的作用域局限于带资源的try语句。

可以在一条try语句中管理多个资源。为此，只需要简单的使用分号分隔每个资源约定即可。下面的程序显示了一个例子。该程序对前面显示的CopyFile进行了改写：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div></pre></td><td class="code"><pre><div class="line">import java.io.*;</div><div class="line"></div><div class="line">class CopyFile</div><div class="line">&#123;</div><div class="line">	public static void main(String[] args)</div><div class="line">	&#123;</div><div class="line">		int i;</div><div class="line">		</div><div class="line">		if(args.length != 2)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;Usage: CopyFile from to&quot;);</div><div class="line">			return;</div><div class="line">		&#125;</div><div class="line">		</div><div class="line">		try(FileInputStream fin = new FileInputStream(args[0]);</div><div class="line">			FileOutputStream fout = new FileOutputStream(args[1]))</div><div class="line">		&#123;		</div><div class="line">			do</div><div class="line">			&#123;</div><div class="line">				i = fin.read();</div><div class="line">				if(i != -1) fout.write(i);</div><div class="line">			&#125;</div><div class="line">		&#125;</div><div class="line">		catch(IOException e)</div><div class="line">		&#123;</div><div class="line">			System.out.println(&quot;I/O Error: &quot;+e);</div><div class="line">		&#125;</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p><strong>13.7 applet的基础知识</strong></p>
<pre><code>applet好像已经过时了，这里先不写了。
</code></pre><p><strong>13.9 使用instanceof运算符</strong></p>
<pre><code>运算符instanceof德尔一般形式如下所示；

objref instanceof type

其中,objref是对类实例的引用，type是类类型。如果objref是指定的类型或者可以可以被转化为这种指定类型，那么instanceof运算符的求值结果为true;否则为false。
</code></pre><p><strong>13.11 本地方法</strong></p>
<pre><code>偶尔可能希望调用使用非Java语言编写的子例程，尽管这种情况很少见。典型的，这类子例程是作为可以执行的代码(对于正在使用的CPU和环境而言是可执行的代码，即本地代码)而存在的。但是，因为Java程序被编译为字节码，然后由Java运行时系统解释执行(或及时编译),所以看起来不可能从Java程序中调用本地代码子例程。幸运的是，这个结论是错误的。Java提供了native关键字，用于声明本地代码方法。一旦方法使用native进行声明，就可以从Java程序内部调用这些方法，就像调用其他Java方法一样。

为了声明本地方法，在方法声明前使用native修饰符，但不能为方法定义任何方法体。例如：

public native int meth();

在声明了本地方法后，必须编写本地方法，并且需要遵循复杂的步骤序列，将本地方法和Java代码链接起来。

大多数本地代码都是使用C语言编写的。将C代码集成到Java程序中的机制称为Java本地接口(Java Native Interface,JNI)。对于JNI的详细描述超出了本书的范围，不过下面提供的信息对于简单应用程序来说是足够的。

注意：需要遵循的准确步骤根据不同的Java环境可能有所不同，它们还依赖于实现本地代码的语言。后续讨论假定使用Windows环境，使用C语言实现本地代码。另外，这里介绍的方法使用动态链接库，但是从JDK 8开始，也可以创建静态链接库。

要理解这个过程，最容易的方法是通过一个例子。首先，输入下面的简短程序，该程序使用了本地方法test():
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line">public class NativeDemo</div><div class="line">&#123;</div><div class="line">	int i;</div><div class="line">	</div><div class="line">	public static void main(String[] args)</div><div class="line">	&#123;</div><div class="line">		NativeDemo ob = new NativeDemo();</div><div class="line">		</div><div class="line">		ob.i = 10;</div><div class="line">		System.out.println(&quot;This is ob.i before the native method: &quot;+ob.i);</div><div class="line">		</div><div class="line">		ob.test();</div><div class="line">		System.out.println(&quot;This is ob.i after the native method: &quot;+ob.i);</div><div class="line">	&#125;</div><div class="line">	</div><div class="line">	//declare native method</div><div class="line">	public native void test();</div><div class="line">	</div><div class="line">	//load DLL that contains static method </div><div class="line">	//只有加载进动态链接库DLL(NativeDemo.dll)，才能调用本地方法，因为，本地方法打包在了动态链接库中</div><div class="line">	static</div><div class="line">	&#123;</div><div class="line">		//加载动态链接库NativeDemo.dll,注意加载链接库时不需要写后缀名.dll </div><div class="line">		System.loadLibrary(&quot;NativeDemo&quot;);</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>注意test()方法被声明为native并且没有方法体。稍后将使用C语言实现这个方法。还请注意static代码块。在前面已经解释过，static代码块只执行一次，当程序开始时执行(或更精确的说，当第一次加载它的类时执行)。这个例子中，static代码块用于加载包含test()本地实现的动态链接库。

动态链接库是由loadLibrary()方法加载的，该方法是System类的一部分，它的一般形式如下所示：

static void loadLibrary(String filename)

其中，filename是标识库文件名的字符串。对于Windows环境，假定库文件具有.DLL扩展名。

输入程序代码后，编译代码，生成NativeDemo.class。接下来便是生成动态链接库NativeDemo.DLL。步骤如下：

(1)必须使用javah.exe(javah.exe包含于JDK中)生成文件NativeDemo.h。

  在test()方法实现中将包含此头文件NativeDemo.h。

  为了生成NativeDemo.h的头文件，使用下面的命令：

  javah -jni NativeDemo

  这个命令将生成文件名为NativeDemo.h的头文件。在实现test()方法的C文件中必须包含这个头文件。这个命令生成的输出如下所示：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div></pre></td><td class="code"><pre><div class="line">/* DO NOT EDIT THIS FILE - it is machine generated */</div><div class="line">#include &lt;jni.h&gt;</div><div class="line">/* Header for class NativeDemo */</div><div class="line"></div><div class="line">#ifndef _Included_NativeDemo</div><div class="line">#define _Included_NativeDemo</div><div class="line">#ifdef __cplusplus</div><div class="line">extern &quot;C&quot; &#123;</div><div class="line">#endif</div><div class="line">/*</div><div class="line">* Class:     NativeDemo</div><div class="line">* Method:    test</div><div class="line">* Signature: ()V</div><div class="line">*/</div><div class="line">JNIEXPORT void JNICALL Java_NativeDemo_test</div><div class="line">(JNIEnv *, jobject);</div><div class="line"></div><div class="line">#ifdef __cplusplus</div><div class="line">&#125;</div><div class="line">#endif</div><div class="line">#endif</div></pre></td></tr></table></figure>
<pre><code>请特别注意下面的代码，它定义了将要创建test()函数的原型：

JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *, jobject);

注意函数的名称是Java_NativeDemo_test(),必须使用它作为要实现的本地函数的名称。也就是说，不是创建名为test()的C函数，而是创建名为Java_NativeDemo_test()的函数。NativeDemo部分是添加的前缀，因为test()方法是作为NativeDemo类的一部分定义的。记住，另外一个类也可能定义属于自己的test()本地方法，这和NativeDemo声明的test()本地方法完全不同。通过在前缀中包含类名，可以提供一种区分不同版本的手段。作为一般规则，为本地函数提供的名称将包含声明它们的类的名称。

在生成必要的头文件之后，可以编写test()方法的实现代码，并将它们保存在NativeDemo.c文件中：
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line">#&lt;jin.h&gt;  </div><div class="line">#include &quot;NativeDemo.h&quot;</div><div class="line">#include&lt;studio.h&gt;</div><div class="line"></div><div class="line"></div><div class="line">JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *env, jobject obj)</div><div class="line">&#123;</div><div class="line">	jclass cls;</div><div class="line">	jfieldId fid;</div><div class="line">	jint i;</div><div class="line"></div><div class="line">	printf(&quot;Starting the native method.\n&quot;);</div><div class="line">	cls = (*env)-&gt;GetObjectClass(env,obj);</div><div class="line">	fid = (*env)-&gt;GetFieldID(env,cls,&quot;i&quot;,&quot;I&quot;);</div><div class="line"></div><div class="line">	if(fid == 0)</div><div class="line">	&#123;</div><div class="line">		printf(&quot;Could not get field id.\n&quot;);</div><div class="line">		return;</div><div class="line">	&#125;</div><div class="line"></div><div class="line">	i = (*env)-&gt;GetIntField(env,obj,fid);</div><div class="line">	printf(&quot;i = %d\n&quot;,i);</div><div class="line">	(*env)-&gt;SetIntField(env,obj,fid,2*i);</div><div class="line">	printf(&quot;Ending the native method.\n&quot;);</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>注意这个文件包含了jni.h头文件，该头文件包含接口信息。这个头文件是由Java编译器提供的。头文件NativeDemo.h之前有Javah创建。

在这个函数中，GetObjectClass()方法用于获取一个包含有关NativeDemo类信息的C结构。GetFieldID()方法返回一个C结构，该结构包含于类名为&quot;i&quot;的域变量有关的信息。GetIntField()方法该域变量的初始值，SetIntField()方法在该域变量中保存一个更新后的值(用于处理其他类型数据的其他方法请查看jni.h头文件)。

在创建了NativeDemo.c文件后，必须进行编译并创建DLL。要通过Microsoft C/C++编译器完成该工作，需要使用下面的命令行(可能需要指定jni.h以及其次级文件jin_md.h的路径)：

CI /LD NativeDemo.c 

这会生成文件NativeDemo.dll。一旦该工作完成，就可以执行Java程序了，生成的输出如下：


This is ob.i before the native method: 10 
Starting the native method.
i = 10 
Ending the native method.
This is ob.i after the native method: 20.

为什么要创建动态链接库的原因：因为Java代码中执行本地函数meth()需要向动态链接库中查找函数，而不是在NativeDemo.c文件中查找函数。类似于Java调用函数，需要向类的.class文件中查找函数，引入第三方库也是类似，调用的函数需要向第三方库中查找，而不是向源代码中查找。

本地方法存在的问题：
(1)潜在的安全性风险：因为本地方法执行的实际的机器代码，所有可以访问宿主系统的所有部分。也就是说，本地代码可以离开Java执行环境。
(2)可移植性丢失：本地代码因为包含在DLL中，所以必须存在于执行Java程序的机器上。而且，本地方法依赖于CPU和操作系统，所以DLL本身是不可移植的。
   因此，使用本地方法的Java程序只能运行于已经安装了兼容DLL的机器上。

 因此，应当限制使用本地代码，因为它们会使Java程序不可移植，并且会造成严重的安全性风险。
</code></pre><p><strong>13.12 使用assert</strong></p>
<pre><code>assert关键字有两种形式。第一种形式如下所示：

assert condition;

其中，condition是一个求值结果必须为布尔类型的表达式。如果结果为true，那么断言为真，不会发生其他动作。如果条件为false,那么断言失败并抛出默认的AssertionError对象。

assert关键字的第二种形式如下所示：

assert condition: expr;

在这个版本中，expr是传递给AssertionError构造函数的值。这个值被转换成响应的字符串格式，并且如果断言失败，将会显示该字符串。
</code></pre><p><strong>13.14 通过this()调用重载的构造函数</strong></p>
<pre><code>当使用重载的构造函数时，在一个构造函数中调用另一个构造函数有时是有用的。在Java中，这是通过使用this关键字的另外一种形式完成的，它的一般形式如下所示

this(arg-list)

当执行this()时，首先执行与arg-list标识的参数列表相匹配的构造函数。然后，如果在原始构造函数中还有其他语句时，就执行这些语句。在构造函数中，对this()的调用必须是第一条语句。

例如：下面没有使用this()的类。
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div></pre></td><td class="code"><pre><div class="line">class MyClass</div><div class="line">&#123;</div><div class="line">	int a;</div><div class="line">	int b;</div><div class="line">	</div><div class="line">	MyClass(int i,int j)</div><div class="line">	&#123;</div><div class="line">		a = i;</div><div class="line">		b = j;</div><div class="line">	&#125;</div><div class="line">	</div><div class="line">	MyClass(int i)</div><div class="line">	&#123;</div><div class="line">		a = i;</div><div class="line">		b = i;</div><div class="line">	&#125;</div><div class="line">	</div><div class="line">	MyClass()</div><div class="line">	&#123;</div><div class="line">		a = 0;</div><div class="line">		b = 0;</div><div class="line">	&#125;</div><div class="line">&#125;</div><div class="line"></div><div class="line">使用this()的类，如下所示：</div><div class="line"></div><div class="line">class MyClass</div><div class="line">&#123;</div><div class="line">	int a;</div><div class="line">	int b;</div><div class="line">	</div><div class="line">	MyClass(int i,int j)</div><div class="line">	&#123;</div><div class="line">		a = i;</div><div class="line">		b = j;</div><div class="line">	&#125;</div><div class="line">	</div><div class="line">	MyClass(int i)</div><div class="line">	&#123;</div><div class="line">		this(i,i);</div><div class="line">	&#125;</div><div class="line">	</div><div class="line">	MyClass()</div><div class="line">	&#123;</div><div class="line">		this(0,0);</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<pre><code>使用this()需要牢记两条限制。
首先，在调用this()this时不能使用当前类的任何实例变量。
其次，在同一个构造函数中不能同时使用supper()和this(),因为它们都必须是构造函数中的第一条语句。

注意：this()最适合用于包含大量初始化代码的构造函数，而不适合用于那些只简单设置少了域变量值的构造函数。
</code></pre><p>出自：《Java 8编程参考官方教程(第9版)》</p>
</the>
      
    </div>
    
  </div>
  
    
    <div class="copyright">
        <p><span>本文标题:</span><a href="/Programming/Java/Java之I-O以及其它主题/">Java之I/O以及其它主题</a></p>
        <p><span>文章作者:</span><a href="/" title="回到主页">FreeShow</a></p>
        <p><span>发布时间:</span>2016-07-23, 23:07:45</p>
        <p><span>最后更新:</span>2017-03-28, 16:06:48</p>
        <p>
            <span>原始链接:</span><a class="post-url" href="/Programming/Java/Java之I-O以及其它主题/" title="Java之I/O以及其它主题">https://freeshow.github.io/Programming/Java/Java之I-O以及其它主题/</a>
            <span class="copy-path" data-clipboard-text="原文: https://freeshow.github.io/Programming/Java/Java之I-O以及其它主题/　　作者: FreeShow" title="点击复制文章链接"><i class="fa fa-clipboard"></i></span>
            <script> var clipboard = new Clipboard('.copy-path'); </script>
        </p>
        <p>
            <span>许可协议:</span><i class="fa fa-creative-commons"></i> <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" title="CC BY-NC-SA 4.0 International" target = "_blank">"署名-非商用-相同方式共享 4.0"</a> 转载请保留原文链接及作者。
        </p>
    </div>



    <nav id="article-nav">
        
            <div id="article-nav-newer" class="article-nav-title">
                <a href="/Programming/Java/Java之枚举、自动装箱与注解（元数据）/">
                    Java之枚举、自动装箱与注解（元数据）
                </a>
            </div>
        
        
            <div id="article-nav-older" class="article-nav-title">
                <a href="/Programming/Java/Java之lambda表达式/">
                    Java之lambda表达式
                </a>
            </div>
        
    </nav>

  
</article>

    <div id="toc" class="toc-article">
        <strong class="toc-title">文章目录</strong>
        
            
        
    </div>
    <style>
        .left-col .switch-btn,
        .left-col .switch-area {
            display: none;
        }
        .toc-level-3 i,
        .toc-level-3 ol {
            display: none !important;
        }
    </style>

    <input type="button" id="tocButton" value="隐藏目录"  title="点击按钮隐藏或者显示文章目录">

    <script>
        yiliaConfig.toc = ["隐藏目录", "显示目录", !!"false"];
    </script>



    
<div class="share">
    
        <div class="bdsharebuttonbox">
            <a href="#" class="fa fa-twitter bds_twi" data-cmd="twi" title="分享到推特"></a>
            <a href="#" class="fa fa-weibo bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a>
            <a href="#" class="fa fa-qq bds_sqq" data-cmd="sqq" title="分享给 QQ 好友"></a>
            <a href="#" class="fa fa-files-o bds_copy" data-cmd="copy" title="复制网址"></a>
            <a href="#" class="fa fa fa-envelope-o bds_mail" data-cmd="mail" title="通过邮件分享"></a>
            <a href="#" class="fa fa-weixin bds_weixin" data-cmd="weixin" title="生成文章二维码"></a>
            <a href="#" class="fa fa-share-alt bds_more" data-cmd="more"></i></a>
        </div>
        <script>
            window._bd_share_config={
                "common":{"bdSnsKey":{},"bdText":"Java之I/O以及其它主题　| FreeShow　","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"24"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
        </script>
    

    
</div>







    
      <div class="duoshuo" id="comments">
    <div id="comment-box" ></div>
    <div class="ds-thread" id="ds-thread" data-thread-key="Programming/Java/Java之I-O以及其它主题/" data-title="Java之I/O以及其它主题" data-url="https://freeshow.github.io/Programming/Java/Java之I-O以及其它主题/"></div>
    <script>
        var duoshuoQuery = {short_name:"freeshowgithub"};
        var loadComment = function(){
            var d = document, s = d.createElement('script');
            s.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
            s.async = true; s.charset = 'UTF-8';
            (d.head || d.body).appendChild(s);
        }

        
    </script>
    
    <script> loadComment(); </script>

</div>
    




    <div class="scroll" id="post-nav-button">
        
            <a href="/Programming/Java/Java之枚举、自动装箱与注解（元数据）/" title="上一篇: Java之枚举、自动装箱与注解（元数据）">
                <i class="fa fa-angle-left"></i>
            </a>
        

        <a title="文章列表"><i class="fa fa-bars"></i><i class="fa fa-times"></i></a>

        
            <a href="/Programming/Java/Java之lambda表达式/" title="下一篇: Java之lambda表达式">
                <i class="fa fa-angle-right"></i>
            </a>
        
    </div>

    <ul class="post-list"><li class="post-list-item"><a class="post-list-link" href="/BigData/Hadoop/Hadoop分布式集群安装/">Hadoop分布式集群安装</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hive/Hive应用实例：WordCount/">Hive应用实例：WordCount</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hive/Hive安装/">Hive安装</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hadoop/Windows下使用eclipse插件运行自己的MapReduce程序/">Windows下使用Eclipse插件运行自己的MapReduce程序</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hadoop/MapReduce之去重计数类应用/">MapReduce之去重计数类应用</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hadoop/MapReduce之简单排序类应用/">MapReduce之简单排序类应用</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hadoop/MapReduce之连接操作类应用/">MapReduce之连接操作类应用</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hadoop/MapReduce之计数类应用/">MapReduce之计数类应用</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hadoop/MapReduce之二次排序类应用/">MapReduce之二次排序类应用</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hadoop/MapReduce之倒排索引类应用/">MapReduce之倒排索引类应用</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hadoop/HDFS Java API/">HDFS Java API</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Kafka/Kafka集群安装/">Kafka集群安装</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Hadoop/Windows下使用eclipse编译打包运行自己的MapReduce程序 Hadoop2.6.0/">Windows下使用eclipse编译打包运行自己的MapReduce程序 Hadoop2.6.0</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/ZooKeeper/ZooKeeper集群安装/">ZooKeeper集群安装</a></li><li class="post-list-item"><a class="post-list-link" href="/BigData/Spark/Spark安装和集群部署/">Spark安装和集群部署</a></li><li class="post-list-item"><a class="post-list-link" href="/Comprehensive/BuildBlog/GitHub Pages + Hexo搭建个人博客/">GitHub Pages + Hexo搭建个人博客</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python爬虫实例：登录豆瓣并修改签名/">Python爬虫实例：登录豆瓣并修改签名</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python爬虫实例：用requests重构豆瓣热播电影爬虫/">Python爬虫实例：用requests重构豆瓣热播电影爬虫</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python爬虫实例：豆瓣热播电影/">Python爬虫实例：豆瓣热播电影（urllib+urllib2）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python爬虫之requests介绍/">Python爬虫之requests介绍</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python爬虫之urllib2介绍/">Python爬虫之urllib2介绍</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python爬虫之urllib介绍/">Python爬虫之urllib介绍</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Cookie介绍/">Cookie介绍</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python爬虫实例：从百度图片下载壁纸/">Python爬虫实例：从百度图片下载壁纸</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python线程/">Python线程</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/XPath与多线程爬虫/">XPath与多线程爬虫</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python之正则表达式/">Python之正则表达式</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python爬虫实例：唐诗三百首/">Python爬虫实例：唐诗三百首</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python爬虫进阶/">Python爬虫进阶</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python初步使用scrapy/">Python初步使用Scrapy</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python开发简单爬虫之实战演练/">Python开发简单爬虫之实战演练</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Python/Python开发简单爬虫之爬虫介绍（一）/">Python开发简单爬虫之爬虫介绍</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/FreeSwitch/FreeSwitch压力测试/">FreeSwitch压力测试</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/FreeSwitch/FreeSwitch使用mod-xml-curl提供动态用户管理/">FreeSwitch使用mod_xml_curl提供动态用户管理</a></li><li class="post-list-item"><a class="post-list-link" href="/Comprehensive/Tools/Win10下MarkdownPad安装及问题/">Win10下MarkdownPad安装及问题</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Linux/Ubuntu14-04安装Apache-php5-mysql-phpmyadmin/">Ubuntu14.04安装Apache+php5+mysql+phpmyadmin</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/C/Linux下C语言入门准备/">Linux下C语言入门准备</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Linux/vi编辑器/">vi编辑器</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Shell/Shell简单介绍/">Shell简单介绍</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Linux/linux基础（四）/">linux基础（四）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Linux/Linux基础（三）/">Linux基础（三）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Linux/Linux基础（二）/">Linux基础（二）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Linux/Ubuntu Server 14.04 静态IP简单配置/">Ubuntu Server 14.04 静态IP简单配置</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Linux/Linux基础（一）/">Linux基础（一）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之Handler详解（一）-关联到UI线程/">Android之Handler详解（一）---关联到UI线程</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之Handler详解（二）-关联到非UI线程/">Android之Handler详解（二）---关联到非UI线程</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之更新UI的方法/">Android之更新UI的方法</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之延迟执行某个任务/">Android之延迟执行某个任务</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/AndroidStudio之环境设置 /">初次安装AndroidStudio之环境设置</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/java里如何正确计算检验和/">java里如何正确计算检验和</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之AsyncTask介绍/">Android之AsyncTask介绍</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之Fragment（一）-简介/">Android之Fragment（一）--简介</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之Fragment（二）-使用/">Android之Fragment（二）--使用</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之Fragment（三）-生命周期与回退栈/">Android之Fragment（三）--生命周期与回退栈</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java运行时多态性：继承和接口的实现/">Java运行时多态性：继承和接口的实现</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之Fragment（四）-Fragment与Activity通讯/">Android之Fragment（四）--Fragment与Activity通讯</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之RAM、ROM和SD卡/">Android之RAM、ROM和SD卡</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之使用全局变量的两种方法/">Android之使用全局变量的两种方法</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之数据存储-SharedPreference/">Android之数据存储--SharedPreference</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之数据存储-File内部存储/">Android之数据存储--File内部存储</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之数据存储-外部存储（SD卡）/">Android之数据存储--外部存储（SD卡）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之音频播放（MediaPlayer和SoundPool）/">Android之音频播放（MediaPlayer和SoundPool）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之话筒、听筒、扬声器/">Android之话筒、听筒、扬声器</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之数据存数-SQLite数据库/">Android之数据存数--SQLite数据库</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之AdapterView及子类/">Android之AdapterView及子类</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之ListView和ListActivity-ArrayAdapter/">Android之ListView和ListActivity--ArrayAdapter</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之列表视图（LitView）-SimpleAdapter/">Android之列表视图（LitView）--SimpleAdapter</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之列表视图（LstView）-BaseAdapter/">Android之列表视图（LstView）--BaseAdapter</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之自动完成文本框（AutoCompleteTextView）/">Android之自动完成文本框（AutoCompleteTextView）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之网格视图（GridView）/">Android之网格视图（GridView）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之可扩展的列表组件（ExpandableListView）/">Android之可扩展的列表组件（ExpandableListView）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/ListView的性能优化之convertView和viewHolder/">ListView的性能优化之convertView和viewHolder</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/android-layout-weight的真实含义/">android:layout_weight的真实含义</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Android/Android之使用9Patch图片作为背景/">Android之使用9Patch图片作为背景</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java综述/">Java综述</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之数据类型、变量和数组/">Java之数据类型、变量和数组</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之运算符/">Java之运算符</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之控制语句/">Java之控制语句</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之类/">Java之类</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之方法和类的深入分析/">Java之方法和类的深入分析</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之继承/">Java之继承</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之包和接口/">Java之包和接口</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之异常处理/">Java之异常处理</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之多线程编程/">Java之多线程编程</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之枚举、自动装箱与注解（元数据）/">Java之枚举、自动装箱与注解（元数据）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之I-O以及其它主题/">Java之I/O以及其它主题</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之lambda表达式/">Java之lambda表达式</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之字符串处理/">Java之字符串处理</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Java/Java之集合框架/">Java之集合框架</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Scala/Scala访问控制修饰符/">Scala访问控制修饰符</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Scala/Scala类/">Scala类</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Scala/Scala函数（一）/">Scala函数（一）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Scala/Scala函数（二）/">Scala函数（二）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Scala/Scala单例对象/">Scala单例对象</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/WebRTC/使用WebRTC搭建前端视频聊天室——信令篇/">使用WebRTC搭建前端视频聊天室——信令篇</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/WebRTC/使用WebRTC搭建前端视频聊天室——数据通道篇/">使用WebRTC搭建前端视频聊天室——数据通道篇</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/WebRTC/使用WebRTC搭建前端视频聊天室——点对点通信篇/">使用WebRTC搭建前端视频聊天室——点对点通信篇</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/WebRTC/WebRTC工作流程/">WebRTC工作流程</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/WebRTC/Android之WebRTC实现/">Android之WebRTC实现</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/WebRTC/Android之WebRTC介绍（二）/">Android之WebRTC介绍（二）</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/WebRTC/Android之WebRTC介绍（一）/">Android之WebRTC介绍（一）</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/WebRTC/WebRTC之turn服务器搭建/">WebRTC之turn服务器搭建</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/XMPP/openfire之SSL认证/">openfire之SSL认证</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/XMPP/基于openfire-smack开发Android即时聊天应用-一-用户注册、登陆、修改密码、注销等/">基于openfire+smack开发Android即时聊天应用[一]-用户注册、登陆、修改密码、注销等</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/OpenSIPs/ubuntu下opensips安装配置/">ubuntu下opensips安装配置</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Linux/计算机是如何启动的？/">计算机是如何启动的？</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Linux/Linux的启动流程/">Linux的启动流程</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/XMPP/Smack Message属性扩展---添加自定义元素(标签)/">Smack Message属性扩展--添加自定义元素（标签）</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/DataStructure/线性表-顺序表/">线性表---顺序表</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/SIP/SIP对话流程/">SIP对话流程</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/SIP/SIP服务器类型/">SIP服务器类型</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/SIP/SIP注册过程/">SIP注册过程</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/OpenSIPs/openSIPS路由类型/">openSIPS路由类型</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/OpenSIPs/opensips函数/">opensips函数</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/SIP/SIP路由字段和机理/">SIP路由字段和机理</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/OpenSIPs/opensips-csipsimple出现的各种问题/">opensips+csipsimple出现的各种问题</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/OpenSIPs/opensips介绍/">opensips介绍</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Shell/Shell编程（八）-输入输出重定向、文件包含/">Shell编程（八）---输入输出重定向、文件包含</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Shell/Shell编程（七）-函数/">Shell编程（七）---函数</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Shell/Shell编程（六）-循环/">Shell编程（六）---循环</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Shell/Shell编程（五）-if、case/">Shell编程（五）---if、case</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Shell/Shell编程（四）-echo、printf/">Shell编程（四）---echo、printf</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Shell/Shell编程（三）-字符串、数组/">Shell编程（三）---字符串、数组</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Shell/Shell编程（二）-替换、运算符、注释/">Shell编程（二）---替换、运算符、注释</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Shell/Shell编程（一）/">Shell编程（一）</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/WebRTC/使用WebRTC搭建前端视频聊天室——入门篇/">使用WebRTC搭建前端视频聊天室——入门篇</a></li><li class="post-list-item"><a class="post-list-link" href="/Comprehensive/BuildBlog/更改Yelee主题标签云为球形标签云/">更改Yelee主题标签云为球形标签云</a></li><li class="post-list-item"><a class="post-list-link" href="/Communication/FreeSwitch/FreeSwitch安装文档/">FreeSwitch安装文档</a></li><li class="post-list-item"><a class="post-list-link" href="/Comprehensive/BuildBlog/Hexo主题Yelee介绍/">Hexo主题Yelee介绍</a></li><li class="post-list-item"><a class="post-list-link" href="/Programming/Linux/Ubuntu14-04安装JDK与配置环境变量/">Ubuntu14.04安装JDK与配置环境变量</a></li></ul>




    <script>
        
    </script>
</div>
      <footer id="footer">
    <div class="outer">
        <div id="footer-info">
            <div class="footer-left">
                <i class="fa fa-copyright"></i> 
                2016-2017 FreeShow
            </div>
            <div class="footer-right">
                <a href="http://hexo.io/" target="_blank" title="快速、简洁且高效的博客框架">Hexo</a>  Theme <a href="https://github.com/MOxFIVE/hexo-theme-yelee" target="_blank" title="简而不减 Hexo 双栏博客主题  v3.5">Yelee</a> by MOxFIVE <i class="fa fa-heart animated infinite pulse"></i>
            </div>
        </div>
        
            <div class="visit">
                
                    <span id="busuanzi_container_site_pv" style='display:none'>
                        <span id="site-visit" title="本站到访数"><i class="fa fa-user" aria-hidden="true"></i><span id="busuanzi_value_site_uv"></span>
                        </span>
                    </span>
                
                
                    <span>| </span>
                
                
                    <span id="busuanzi_container_page_pv" style='display:none'>
                        <span id="page-visit"  title="本页阅读量"><i class="fa fa-eye animated infinite pulse" aria-hidden="true"></i><span id="busuanzi_value_page_pv"></span>
                        </span>
                    </span>
                
            </div>
        
    </div>
</footer>
    </div>
    
    <script src="/js/GithubRepoWidget.js"></script>

<script data-main="/js/main.js" src="//cdn.bootcss.com/require.js/2.2.0/require.min.js"></script>

    <script>
        $(document).ready(function() {
            var iPad = window.navigator.userAgent.indexOf('iPad');
            if (iPad > -1 || $(".left-col").css("display") === "none") {
                var bgColorList = ["#9db3f4", "#414141", "#e5a859", "#f5dfc6", "#c084a0", "#847e72", "#cd8390", "#996731"];
                var bgColor = Math.ceil(Math.random() * (bgColorList.length - 1));
                $("body").css({"background-color": bgColorList[bgColor], "background-size": "cover"});
            }
            else {
                var backgroundnum = 5;
                var backgroundimg = "url(/background/bg-x.jpg)".replace(/x/gi, Math.ceil(Math.random() * backgroundnum));
                $("body").css({"background": backgroundimg, "background-attachment": "fixed", "background-size": "cover"});
            }
        })
    </script>





    <script type="text/x-mathjax-config">
MathJax.Hub.Config({
    tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
        processEscapes: true,
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
    }
});

MathJax.Hub.Queue(function() {
    var all = MathJax.Hub.getAllJax(), i;
    for(i=0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';                 
    }       
});
</script>

<script src="//cdn.bootcss.com/mathjax/2.6.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>


<div class="scroll" id="scroll">
    <a href="#" title="返回顶部"><i class="fa fa-arrow-up"></i></a>
    <a href="#comments" onclick="load$hide();" title="查看评论"><i class="fa fa-comments-o"></i></a>
    <a href="#footer" title="转到底部"><i class="fa fa-arrow-down"></i></a>
</div>
<script>
    // Open in New Window
    
        var oOpenInNew = {
             github: ".github-widget a", 
            
            
            
            
            
             archives: ".archive-article-title", 
             miniArchives: "a.post-list-link", 
            
             friends: "#js-friends a", 
             socail: ".social a" 
        }
        for (var x in oOpenInNew) {
            $(oOpenInNew[x]).attr("target", "_blank");
        }
    
</script>

<script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js">
</script>
  </div>
</body>
</html>